﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data.Entity;
using System.ComponentModel.DataAnnotations.Schema;

namespace YGLAB_SON.Models
{
    public class Journal                                    // daha sonra yayınlanma sıklığı ile ilgili bir şeyler de eklenecek
    {
        public int Id { get; set; }
        public virtual User Editor { get; set; }
        public string Name { get; set; }
        public string PathName { get; set; }
        public int ArticleNum { get; set; }
        public Nullable<DateTime> NextPubDate { get; set; }
        
        public List<Science> Sciences { get; set; }
        public List<Subject> Subjects { get; set; }
        
    }
    public class Publication
    {
        public int Id { get; set; }
        public virtual Journal Journal { get; set; }
        public int Year { get; set; }
        public int PubNoInYear { get; set; }
        public Nullable<DateTime> PubDate { get; set; }
    }
    public class Article
    {
        public int Id { get; set; }
        public int State { get; set; }          // 1: değerlendirmede, 2: reddedildi, 3: sırada bekliyor, 4: yayınlandı
        public Journal Journal { get; set; }
        public Publication Publication { get; set; }
        public User Author { get; set; }
        public int NoInYear { get; set; }
    }
    public class Version
    {
        public int Id { get; set; }
        public float VersionNo { get; set; }
        public int State { get; set; }          // 1: yeni oluşturuldu(editörde), 2: değerlendiriliyor(hakemlerde), 
        public string Title { get; set; }       // 3: değerlendirildi (tekrar editörde), 4: karar verildi
        public string Abstract { get; set; }
        public Article Article { get; set; }
        public List<Science> Sciences { get; set; }
        public List<Subject> Subjects { get; set; }
        public List<User> Refrees { get; set; }
        public DateTime NewVersionDueDate { get; set; }
        public DateTime EvaluationDueDate { get; set; }
        public string EditorOpinion { get; set; }
    }
    public class Question
    {
        public int Id { get; set; }
        public virtual Journal Journal { get; set; }
        public string QuestionText { get; set; }
    }
    public class User
    {
        public int Id { get; set; }
        public List<Version> RefreedVersions { get; set; }
    }
    
    public class Evaluation
    {
        public int Id { get; set; }
        public virtual User Refree { get; set; }
        public virtual Version Version { get; set; }
        public string Opinion { get; set; }
        public bool IsCompleted { get; set; }
    }
    public class Answer
    {
        public int Id { get; set; }
        public virtual Question Question { get; set; }
        public virtual Evaluation Evaluation { get; set; }
        public int Result { get; set; }                     // 1 ise evet, 2 ise hayır cevabı verilmiş demektir.
    }
    
    public class Invitation
    {
        public int Id { get; set; }
        public int InvitationType { get; set; }
        public int UserType { get; set; }
        public User InvitedUser { get; set; }
        public string InvitedUserEmail { get; set; }
        public DateTime AcceptDueDate { get; set; }
        public int IsAccepted { get; set; }
    }
    public class CronJob
    {
        public int Id { get; set; }
        public int Type { get; set; }
        public DateTime DateOfRun { get; set; }
        public Journal Journal { get; set; }    // dergi yayınlanma tarihinde çalışan type 1 için
        public Version Version { get; set; }    // makale değerlendirme süresi ve yeni versiyon oluşturma süresi dolduğunda çalışan type 2 ve 3 için
        public Invitation Invitation { get; set; }  // editör olma davetinin son kabul edilme tarihi dolduğunda çalışan type 4 için
    }
    public class Notification
    {
        public int Id { get; set; }
        public int Type { get; set; }
        public User User { get; set; }
        public Invitation Invitation { get; set; }  // type 1-2-3 için kullanılacak
        public Version Version { get; set; }        // type 4-5-6-7 için kullanılacak
    }
    
    public class Reference
    {
        public int Id { get; set; }
        public Article ReferencingArticle { get; set; }
        public int Type { get; set; }
        public Article ReferencedArticle { get; set; }
        public string ReferencedArticleTitle { get; set; }
    }
    public class Science
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Journal> Journals { get; set; }
        public List<Version> Versions { get; set; }

    }
    public class Subject
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Journal> Journals { get; set; }
        public List<Version> Versions { get; set; }
    }

    // CONTEXT

    public class YgContext : DbContext
    {
        public DbSet<Science> Sciences { get; set; }
        public DbSet<Subject> Subjects { get; set; }
        public DbSet<Journal> Journals { get; set; }
        public DbSet<Publication> Publications { get; set; }
        public DbSet<Article> Articles { get; set; }
        public DbSet<Version> Versions { get; set; }
        public DbSet<Reference> References { get; set; }
        public DbSet<Question> Questions { get; set; }
        public DbSet<Answer> Answers { get; set; }
        public DbSet<Evaluation> Evaluations { get; set; }
        //public DbSet<User> Users { get; set; }

        public Invitation Invitations { get; set; }
        public CronJob CronJobs { get; set; }
        public Notification Notifications { get; set; }
    }
}

// conn.Invitations.OfType<InvitationToEditor>()